package com.goat.model.element;

import javax.swing.*;
import java.awt.*;

/**
 * 基类
 */

public abstract class BaseElement {
    private int x;
    private int y;
    private int w;
    private int h;
    //对应位置放的图片
    private ImageIcon imageIcon;
    //还有很多...
    private boolean isLive=true;

    public BaseElement(){}

    public BaseElement(int x, int y, int w, int h, ImageIcon imageIcon) {
        this.x = x;
        this.y = y;
        this.w = w;
        this.h = h;
        this.imageIcon = imageIcon;
    }

    /**
     * 为视图层(JPanel)提供一个显示的方法
     */
    public abstract void showElement(Graphics g);

    public BaseElement createElement(String str){
        return null;
    }

    /**
     *
     * @param f 约定：true为press   false为release
     * @param key   传入的key对应的code
     *       需要实现键盘监听的子类重写此方法
     *
     *   方法二：接口(不使用)
     */
    public void keyListen(boolean f,int key){

    }

    /**
     * 设计模式：模板模式   在模板中定义了对象方法的执行顺序，由子类选择性重写
     *          2.move  1.updateImage   3.shot
     *
     *          模板方法给外界调用，但不能重写
     *          模板中的方法不能被调用，子类可以重写，实现多态
     */

    public final void modelMethodObj(int gameTime){
        updateImage(gameTime);
        move();
        shot(gameTime);
    }

    protected void shot(int gameTime) {
    }

    protected void updateImage(int gameTime) {
    }

    protected void move(){
    }

    public void die(){
    }

    public Rectangle getRect(){
        return new Rectangle(x,y,w,h);
    }

    public boolean PkCheck(BaseElement element){
        return getRect().intersects(element.getRect());
    }






    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }

    public int getW() {
        return w;
    }

    public void setW(int w) {
        this.w = w;
    }

    public int getH() {
        return h;
    }

    public void setH(int h) {
        this.h = h;
    }

    public ImageIcon getImageIcon() {
        return imageIcon;
    }

    public void setImageIcon(ImageIcon imageIcon) {
        this.imageIcon = imageIcon;
    }

    public boolean isLive() {
        return isLive;
    }

    public void setLive(boolean live) {
        isLive = live;
    }
}
